package main

import "fmt"

func main() {
	/*
		1.数据类型：
			基本数据类型：整数，浮点，布尔，字符串
			复合类型：array, slice, map, struct, pointer, function, channel...
		2.数组：
			1.概念：存储一组相同数据类型的数据结构
				理解为容器，存储一组数据
				数组从声明时就确定，使用时可以修改数组成员，但是数组的大小是不可变化的。

			2.语法：
				var 数组名 [长度]数据类型
				var 数组名 = [长度]数据类型{元素1, 元素2, 元素3...}
				数组名 := [...]数组名{元素1, 元素2...}
			注：
				数组的长度必须是常量！！！~~~
				长度也是数组类型的一部分！！！~~~
				一旦定义，长度就不能变！！！~~~

			3.通过下标访问：
				下标，也叫索引，index
				默认从 0 开始的整数，直到长度减 1
				数组名[index]
					赋值
					取值
				不能越界：[0,长度-1]
					触发访问越界，会 panic

			4.长度和容量：go语言的内置函数
				len(array/map/slice/string) 长度（容器中实际存储的数据量）
				cap(array/map/slice/string) 容量（容器中能够存储的最大的数量）

		3.数组的回收：
			GC：垃圾自动回收

		4.注：数组的长度也是数组类型的组成部分
			eg：[10]int 和 [20]int 表示不同的类型
	*/

	//step1：创建数组
	var arr1 [4]int
	//step2：数组的访问
	arr1[0] = 1
	arr1[1] = 2
	fmt.Println(arr1[0])

	fmt.Println("数组的长度：", len(arr1)) //容器中实际存储的数据量
	fmt.Println("数组的容量：", cap(arr1)) //容器中能够存储的最大的数量
	//因为数组定长，长度与容量相同

	//数组的其他创建方式
	var a [4]int // 同 var a = [4]int，默认存储的是零值
	fmt.Println(a)

	var b = [4]int{1, 2, 3, 4}
	fmt.Println(b)

	var c = [5]int{1, 2, 4} // c[4] = 0
	fmt.Println(c)

	var d = [5]int{1: 1, 3: 2} //通过下标在指定位置上存储数值，d[1] = 1, d[3] = 2
	fmt.Println(d)

	var e = [5]string{"rose", "王二狗", "ruby"} //字符串的零值为空的字符串
	fmt.Println(e)

	f := [...]int{1, 2, 3, 4, 5}
	fmt.Println(f)
	g := [...]int{1: 3, 6: 5}
	fmt.Println(g)

	//make 创建一维数组
	res := make([]int, 10)
	for _, r := range res {
		fmt.Print(r, " ") //0 0 0 0 0 0 0 0 0 0
	}
	fmt.Println()
}
